/**
 ****************************************
 * @file store_app.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-04-21
 * @copyright Copyright (c) 2025
 * @desc: 系统参数的掉电保存。
 *        把重要的数据放到flash或EEPROM保存保证掉电后 数据不丢失
 *        在储存区域中开辟两个储存空间 1.主数据区域  2.备份区域
 *
 * ***************************************
 */
#ifndef __STORE_APP__
#define __STORE_APP__

#include <stdint.h>
#include <stdio.h>
#include "math_app.h"
#include <stdbool.h>
#include "eeprom_drv.h"
#include "gd32f30x.h"

 // 魔数值  读取时通过比对可判断参数是否已初始化
#define MAGIC_CODE     0x5A5A

// 每个储存区域的最大储存字节数
#define SYSPARAM_MAX_SIZE              128
// 主存储区域的起始地址
#define SYSPARAM_START_ADDR            0
// 后备存储区域的起始地址
#define BACKUP_START_ADDR              128

typedef struct {
  	// 魔数值
    uint16_t  magicCode;
    // 系统参数1: modbus的从机地址
    uint8_t modbusAddr;
    // 系统参数2: pwmDuty
    uint8_t pwmDuty;
    // crc校验值
    uint8_t crcVal;
} SysParam_t;

// 错误码枚举
typedef enum {
    SPS_OK = 0,
    SPS_READ_STORE_FAIL,
    SPS_READ_MAGIC_MISMATCH,
    SPS_READ_CRC_MISMATCH,
    SPS_WRITE_STORE_FAIL,
    SPS_WRITE_PRIMARY_FAIL,
    SPS_WRITE_BACKUP_FAIL,
    SPS_DATA_LEN_OVERFLOW
} SysParamStatusCode_e;

/**
 * @desc  : 系统参数初始化
 * @date  : 2025-04-21
 * @author: AnRui
 * @return: SysParam_t
 * @note  : 如果
 */
void InitSysParam(void);



/**
 * @desc  : 获取系统当前参数
 * @date  : 2025-04-22
 * @author: AnRui
 * @return: SysParam_t
 * @note  :
 */
SysParam_t GetSysParam(void);



/**
 * @desc  : 修改系统参数之modbusAddr
 * @date  : 2025-04-22
 * @author: AnRui
 * @param : addr - {参数说明}:
 * @return: true
 * @return: false
 * @note  :
 */
bool UpdateSysParamModbusAddr(uint8_t addr);


#endif // __STORE_APP__
